#ifndef EXPPEOPLE_H
#define EXPPEOPLE_H



#include "expression.h"
#include "person.h"



class ExpAllHumans : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpAllHumans( Category *cat, Subject *owner );
};



class ExpAllWizards : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpAllWizards( Category *cat, Subject *owner );
};



class ExpAllVampires : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpAllVampires( Category *cat, Subject *owner );
};



class ExpSomeHumans : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpSomeHumans( Category *cat, Subject *owner );
};



class ExpSomeWizards : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpSomeWizards( Category *cat, Subject *owner );
};



class ExpSomeVampires : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpSomeVampires( Category *cat, Subject *owner );
};



class ExpName : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner, const char *name );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    static uint8_t complexity(){ return 20; }
    
protected:
    ExpName( Category *cat, Subject *owner, const char *name );

private:
    const char *m_szName;
};



class ExpAllFat : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpAllFat( Category *cat, Subject *owner );
};



class ExpAllSlim : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpAllSlim( Category *cat, Subject *owner );
};



class ExpAllIncognito : public ExpressionCategory
{
public:
    static Expression *createExpression( Category *cat, Subject *owner );
    virtual bool check( Subject *owner ) const;
    virtual void putText( std::ostream &S, Subject *owner, bool invert ) const;
    
protected:
    ExpAllIncognito( Category *cat, Subject *owner );
};



#endif
